/*
 * Copyright (c) Jan Šlahora (${USER}) - 2012.
 * Created in IntelliJ IDEA 10.5
 */

package statistics.Asonance;

import org.omg.PortableInterceptor.ForwardRequestHelper;
import statistics.Samohlasky;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

/*
*   File Asonance
*   in package statistics
*   was created by slaha
*   on 6.3.12 at 14:08.
*
*/
public class Asonance extends Samohlasky implements Runnable {

 // private ArrayList<Character> vokaly;
  private ArrayList<String> texty;
  private ArrayList<ArrayList<Double>> prumeryVsech = new ArrayList<>();
  private ArrayList<Double> prumery = new ArrayList<>();
  private ArrayList<Double> rozptyly = new ArrayList<>();
  double prumer;
  double meziKrokySSO;
  double meziKrokyPSV;
  double meziKrokyRozptyl;
  double vnitrekKrokuSSO;
  double vnitrekKrokuPSV;
  double vnitrekKrokuRozptyl;
  double F;

  public Asonance(ArrayList<String> texty) {
    super();
    this.texty = texty;
    this.run();
    dejPrumery();
    dejPrumer();
    soucetCtvercuOdchylek();
    this.meziKrokyRozptyl = meziKrokySSO / meziKrokyPSV;
    soucetCtvercuOdchylekUvnitr();
    this.vnitrekKrokuRozptyl = vnitrekKrokuSSO / vnitrekKrokuPSV;
    this.F = meziKrokyRozptyl / vnitrekKrokuRozptyl;
    spocitejRozptyly();
    // this.vokaly = dejVokaly(text.toCharArray());
  }

  private ArrayList<Character> dejVokaly(char[] text) {
    ArrayList<Character> vokaly = new ArrayList<>();

    for(char c : text) {
      if (vokaly.size() >= 38) {
        break;
      }
      c = Character.toLowerCase(c);
      for(char samohlaska : samohlasky) {
        if (c == samohlaska) {
          vokaly.add(c);
          break;
        }
      }
    }

    return vokaly;
  }

  private void dejPrumery() {
    int max = dejNejdelsiKolekci();
    double[] sumy = new double[max];
    int[] pocty = new int[max];
    Arrays.fill(sumy, 0.0d);
    Arrays.fill(pocty, 0);

    for (ArrayList<Double> al : prumeryVsech) {
      for (int i  = 0; i < al.size(); i++) {
        sumy[i] += al.get(i);
        pocty[i]++;
      }
    }

    for (int i = 0; i < max; i++) {
      prumery.add(((double) (sumy[i] / pocty[i])));
    }
    /*
    int max = dejNejdelsiKolekci();

    for (int index = 0; index < max; index++) {
      double soucet = 0;
      int pocet = 0;
      //.. projdu všechny arrayListy
      for(int i = 0; i < prumeryVsech.size(); i++) {
        //.. vezmu hodnotu na pozici index
        if (!(prumeryVsech.get(i).get(index) == null)) {
          soucet += prumeryVsech.get(i).get(index);
          pocet++;
        }
      }
      double prumerLokal = soucet / pocet;
      prumery.add(prumerLokal);
    }
    */
  }

  private void dejPrumer() {
    double suma = 0;
    for (Double d : prumery) {
      suma += d;
    }
    prumer = suma / prumery.size();
  }

  private void soucetCtvercuOdchylek() {
    double sso = 0;
    double mocnina;
    meziKrokyPSV = dejNejdelsiKolekci()-1;
    for (int i = 0; i < (meziKrokyPSV + 1); i++) {
      mocnina = Math.pow((prumery.get(i) - prumer), 2);
      sso += mocnina;
    }
    sso *= prumeryVsech.size();

    meziKrokySSO = sso;
  }

  void soucetCtvercuOdchylekUvnitr() {
    double sso = 0;
    /*for (int i = 0; i < prumeryVsech.size(); i++) {
      ArrayList<Double> al = prumeryVsech.get(i);
      double prumer = prumery.get(i);
      for (double d : al) {
        sso += Math.pow((d - prumer), 2);
      }
    }
    */

    for(int i = 0; i < prumery.size(); i++) {
      for(int j = 0; j < prumeryVsech.size(); j++) {
          if (i < prumeryVsech.get(j).size()) {
        //if (!(prumeryVsech.get(j).get(i) == null)) {
          sso += Math.pow((prumeryVsech.get(j).get(i) - prumery.get(i)), 2);
        }
      }
    }
    
    vnitrekKrokuSSO = sso;
    int p = 0;
    for (ArrayList<Double> al : prumeryVsech) {
      p += al.size();
    }
    vnitrekKrokuPSV = (p-1) * prumery.size();
  }

  @Override
  public void run() {
    //.. pro všechny texty
    for(int iiii = 0; iiii < texty.size(); iiii++) {
      //.. arrayList pro průměry
      ArrayList<Double> prumerTextu = new ArrayList<>();

      //.. získám vokály a počet posunů v tom textu
      ArrayList<Character> vokaly = dejVokaly(texty.get(iiii).toCharArray());
      int pocetKroku = (vokaly.size()/2)+1;

      ArrayList<Character> posun = new ArrayList<>();
      posun.addAll(vokaly);
      for(int i = 1; i <= pocetKroku; i++) {

        //..začátek posunu naplnim null
        posun.add(0, null);

        int pocetStejnych = 0;
        //..projdeme vokály a porovnáme s posunem
        for (int x = 0; x < vokaly.size(); x++) {
          if (vokaly.get(x).equals(posun.get(x))) {
            pocetStejnych++;
          }
        }
        //..máme počet stejných.
        //.. spočítáme porovnávané
        int pocetPorovnavanych = vokaly.size() - (i - 1);

        //.. kolik to je
        double pomer = ((double) pocetStejnych / (double) pocetPorovnavanych);

        //.. vložím průměr do ArrayListu
        prumerTextu.add(pomer);
      }

      //.. do prumeru vlozime vypočítané hodnoty
      prumeryVsech.add(prumerTextu);
    }
  }

  private void spocitejRozptyly() {
    for (int i = 0; i < prumeryVsech.size(); i++) {
      ArrayList<Double> al = prumeryVsech.get(i);

      double suma = 0;
      double rozptyl = ((double) 1.0d) / (al.size() - 1);

      for (int j = 0; j < al.size(); j++) {
        double rozdil = al.get(j) - prumery.get(i);
        suma += Math.pow(rozdil, 2);
      } 

      rozptyl *= suma;
      rozptyl = Math.sqrt(rozptyl);
      rozptyly.add(rozptyl);
      System.out.println(rozptyl);
    }
  }
  private int dejNejdelsiKolekci() {
    int max = prumeryVsech.get(0).size();
    for(int xx = 1; xx < prumeryVsech.size(); xx++) {
      if (prumeryVsech.get(xx).size() > max) {
        max = prumeryVsech.get(xx).size();
      }
    }
    return max;
  }
}
